package com.novunda.ecc;


public class SM2 {
	static{
		System.loadLibrary("sm2");
	}
	
	/*
	 * 初始化国密SM2椭圆曲线
	 * @return 初始化成功返回true，失败返回false
	 */ 
	public native boolean initialize();
	
	/*
	 * 生成SM2椭圆曲线密钥对
	 * @return 成功返回密钥对对象，失败返回null
	 */
	public native KeyPair gen_key_pair();

	/*
	 * 数字签名
	 * @param AID用户ID（长度不超过256）
	 * @param M待签名的数据
	 * @param pvkey私钥
	 * @return 签名成功返回签名数据，签名失败返回null
	 */
	public native byte[] signature(final String AID, final byte[] M, final byte[] pvkey);

	/*
	 * 签名验签
	 * @param AID用户ID（长度不超过256）
	 * @param M待验签的数据
	 * @param sig签名数据
	 * @param pukey数据发送方的公钥
	 * @return 验签成功返回true，失败返回false
	 */
	public native boolean verify(final String AID, final byte[] M, final byte[] sig, final byte[] pukey);

	/*
	 * 加密
	 * @param M待加密的数据
	 * @param pukey数据接收方公钥
	 * @return 加密成功返回密文，失败返回null
	 */
	public native byte[] encrypt(final byte[] M, final byte[] pukey);

	/*
	 * 解密
	 * @param cipher待解密的数据
	 * @param pvkey私钥
	 * @return 加密成功返回原文，失败返回null
	 */
	public native byte[] decrypt(final byte[] cipher, final byte[] pvkey);

	/*
	 * 生成通讯密钥对
	 * @param policy策略值（策略公钥）
	 * @return 成功返回密钥对对象，失败返回null
	 */
	public native KeyPair gen_communication_key_pair(final byte[] policy);
	
	/*
	 * 对称加密
	 * @param key密钥，可以为null（内部使用默认密钥）
	 * @param M明文
	 * @param cipher输出参数，密文
	 * @return 成功返回密文，失败返回null
	 */
	public native byte[] special_encrypt(final String key, final byte[] M);
	
	/*
	 * 对称解密
	 * @param key密钥，可以为null（内部使用默认密钥）
	 * @param cipher密文
	 * @param M输出参数，明文
	 * @return 成功返回原文，失败返回null
	 */
	public native byte[] special_decrypt(final String key, final byte[] cipher);
	
	/*
	 * 杂凑算法A
	 * @param M原文
	 * @return 成功返回杂凑值32Bytes，失败返回null
	 */
	public native byte[] hashA(final byte[] M);
	
	/*
	 * 杂凑算法B
	 * @param M原文
	 * @return 成功返回杂凑值32Bytes，失败返回null
	 */
	public native byte[] hashB(final byte[] M);
}
